package com.cloud.ceshi.utils;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.TemplateType;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.querys.MySqlQuery;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.query.SQLQuery;
import org.apache.ibatis.type.JdbcType;

import java.sql.Types;

/**
 * @author helen
 * @since 2018/12/13
 */
public class CodeGenerator {

    public static void main(String[] args) {
        FastAutoGenerator.create("jdbc:mysql://172.18.1.26:3306/seata_account?remarks=true&tinyInt1isBit=true&useInformationSchema=true&useUnicode=true&serverTimezone=UTC&useSSL=false&characterEncoding=utf8", "root", "root")
                .globalConfig(builder -> builder  //全局配置 (GlobalConfig)
                        .author("zwb")// 设置作者
                        //.enableKotlin() // 开启 Kotlin 模式
                        //.enableSwagger() // 开启 swagger 模式
                        .outputDir("E:\\ideaProject\\cloud_mb\\cloud-modules\\cloud-ceshi\\src\\main\\java")// 指定输出目录
                        .dateType(DateType.ONLY_DATE) // 设置时间类型策略
                        .commentDate("yyyy-MM-dd") // 设置注释日期格式
                )
                .dataSourceConfig(builder ->
                        builder.databaseQueryClass(SQLQuery.class)
                                .typeConvert(new MySqlTypeConvert())
                                .dbQuery(new MySqlQuery()).typeConvertHandler(((globalConfig, typeRegistry, metaInfo) -> {
                                    // 兼容旧版本转换成Integer
                                    if (JdbcType.TINYINT == metaInfo.getJdbcType()) {
                                        return DbColumnType.INTEGER;
                                    }
                                    int typeCode = metaInfo.getJdbcType().TYPE_CODE;
                                    if (typeCode == Types.SMALLINT) {
                                        // 自定义类型转换
                                        return DbColumnType.INTEGER;
                                    }
                                    return typeRegistry.getColumnType(metaInfo);
                                }))
                )
                .packageConfig(builder -> builder
                                .parent("com") // 设置父包名
                                .controller("controller")
                                .moduleName("cloud.ceshi") // 设置父包模块名
                                .entity("mode.entity")
                                .mapper("mapper")
                                .service("service")
                                .serviceImpl("service.impl")
                                .xml("mapper.xml")
                       // .pathInfo(Collections.singletonMap(OutputFile.xml, "E:\\ideaProject\\mybatisplus\\xml")) // 设置路径配置信息

                )
                .strategyConfig(builder -> builder
                        .enableCapitalMode() // 开启大写命名
//                        .enableSkipView() // 开启跳过视图
                        .disableSqlFilter() // 禁用 SQL 过滤
                        .addInclude("account")// 设置需要生成的表名
//                        .addTablePrefix( "c_") // 增加过滤表前缀
//                      .addFieldSuffix("_flag") // 增加过滤字段后缀
                        .entityBuilder()
                        .enableLombok() // 启用 Lombok
                        .enableTableFieldAnnotation() // 启用字段注解
                        .controllerBuilder()
                        .enableRestStyle() // 启用 REST 风格
                        .enableHyphenStyle()//开启驼峰转连字符
                                .entityBuilder().columnNaming(NamingStrategy.underline_to_camel)//默认下划线转驼峰命名: NamingStrategy.underline_to_camel
                                .naming(NamingStrategy.underline_to_camel)//数据库表映射到实体的命名策略
                )
//                .templateConfig(builder -> builder
////                        .disable(TemplateType.ENTITY)
//                        .entity("/templates/entity.java")
//                        .service("/templates/service.java")
//                        .serviceImpl("/templates/serviceImpl.java")
//                        .mapper("/templates/mapper.java")
//                        .disable(TemplateType.XML)// 禁用 xml 层生成
//                        .xml("/templates/mapper.xml")
//                        .controller("/templates/controller.java"))// 使用 Freemarker 模板引擎
                .templateEngine(new FreemarkerTemplateEngine())// 使用 Freemarker 模板引擎
                .execute(); // 执行生成
    }
}
